from datetime import datetime

import pandas as pd
import os
import json
from typing import Optional

mock_click_js = """
function triggerFullClick(element) {
  // 1. 触发鼠标按下
  element.dispatchEvent(new MouseEvent('mousedown', {
    bubbles: true,
    cancelable: true,
    view: window
  }));

  // 2. 触发获取焦点
  element.focus();
  element.dispatchEvent(new Event('focus', {bubbles: true}));

  // 3. 触发鼠标释放
  element.dispatchEvent(new MouseEvent('mouseup', {
    bubbles: true,
    view: window
  }));

  // 4. 触发最终点击
  element.dispatchEvent(new MouseEvent('click', {
    bubbles: true,
    view: window
  }));
}

// 执行函数
triggerFullClick(this);
"""

default_file_name = "0421薇诺娜信息流计划搭建2.xlsx"

# 设置显示所有列（默认只显示部分列）
pd.set_option('display.max_columns', None)

# 设置显示所有行（默认只显示部分行）
pd.set_option('display.max_rows', None)

# 设置列宽（防止内容被截断）
pd.set_option('display.max_colwidth', 100)  # 设置每列最大显示宽度
def get_ad_config(row):
    if row['路径名称'] == "信息流-点1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '不启用',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-点2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '启用',
            '深度优化目标': '互动量',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-点3":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '启用',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-点4":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '不启用',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '手动出价',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-点5":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '启用',
            '深度优化目标': '互动量',
            '转化平台': '/',
            '竞价策略': '手动出价',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-点6":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '启用',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '手动出价',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-互1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '不启用',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-互2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '启用',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-站1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '站外转化量',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '淘联-小红星',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-种1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-种2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-深1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "信息流-深2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '信息流推广',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    # 搜索推广
    elif row['路径名称'] == "搜索-自点1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '自动投放',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '/',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-自互1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '自动投放',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '不启用',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-自互2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '自动投放',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '启用',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-自站1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '自动投放',
            '标的类型': '笔记',
            '优化目标': '站外转化量',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '淘联-小红星',
            '竞价策略': '最大转化',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-自种1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '自动投放',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-自种2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '自动投放',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-自深1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '自动投放',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-自深2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '自动投放',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手点1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '不启用',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手点2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '启用',
            '深度优化目标': '互动量',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手点3":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '启用',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手点4":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '点击量',
            '深度优化目标启用': '启用',
            '深度优化目标': '点击份额（SOC）',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手互1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '不启用',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手互2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '启用',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手SOC":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '点击份额（SOC）',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '手动出价',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手站1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '站外转化量',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '淘联-小红星',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手种1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手种2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手深1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "搜索-手深2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '搜索推广',
            '投放模式': '手动投放',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    # 视频流
    elif row['路径名称'] == "视频流-互1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '不启用',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "视频流-互2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '启用',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "视频流-站1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '站外转化量',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "视频流-种1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "视频流-种2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "视频流-深1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "视频流-深2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    # 全站
    elif row['路径名称'] == "全站-互1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '不启用',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "全站-互2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '互动量',
            '深度优化目标启用': '启用',
            '深度优化目标': '站外转化量',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "全站-站1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '站外转化量',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '淘联-小红星',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "全站-种1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "全站-种2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "全站-深1":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '稳定成本',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }
    elif row['路径名称'] == "全站-深2":
        return {
            '营销诉求': '产品种草',
            '投放位置': '视频流推广',
            '标的类型': '笔记',
            '优化目标': '深度种草人群规模',
            '深度优化目标启用': '/',
            '深度优化目标': '/',
            '转化平台': '/',
            '竞价策略': '最大转化',
            '搜索快投': '不开启',
            '广告组': '不加入'
        }

    else:
        return None
def get_set_note_ids(df=None, file_path=None):
    note_ids = []
    for item in df['笔记ID'].tolist():
        ids = [str(x).strip() for x in str(item).split('\n') if str(x).strip()]
        note_ids.extend(ids)

    search_comp = get_search_comp(file_path)  # 转化组件中的笔记ID
    comp_note_ids = [note_id.strip() for note_id in search_comp['笔记ID'].tolist()]

    main_set = set(note_ids)
    comp_set = set(comp_note_ids)

    missing_ids = main_set - comp_set
    return missing_ids  # 主表中有但是附表中不存在的笔记ID
def get_complete_sheet1(file_path=None):
    df = pd.read_excel(file_path, sheet_name="计划列表")  # sheet_name 可省略
    config_df = df.apply(get_ad_config, axis=1, result_type='expand')
    df = pd.concat([df, config_df], axis=1)
    return df

def get_complete_sheet_platform(file_path=None):
    try:
        df = pd.read_excel(file_path, sheet_name="平台精选")
        cols_to_fill = ['人群定向包']
        df[cols_to_fill] = df[cols_to_fill].ffill()
        return df
    except ValueError as e:
        if "Worksheet named '平台精选' not found" in str(e):
            print(f"警告: 文件 {file_path} 中不存在[平台精选]sheet")
            return pd.DataFrame()  # 返回带列名的空DF
        else:
            raise  # 重新抛出其他异常
    except Exception as e:
        print(f"读取文件失败: {e}")
        return pd.DataFrame()

def get_complete_sheet_indus_people(file_path=None):
    """
    读取行业人群sheet，若不存在返回空DataFrame
    """
    try:
        df = pd.read_excel(file_path, sheet_name="行业人群")
        # 处理合并单元格
        cols_to_fill = ['人群定向包', '小类', '一级选项']
        df[cols_to_fill] = df[cols_to_fill].ffill()
        print("成功加载数据:")
        print(df['人群定向包'].tolist())
        print(df.head())
        return df
    except ValueError as e:
        if "Worksheet named '行业人群' not found" in str(e):
            print(f"警告: 文件 {file_path} 中不存在[行业人群]sheet")
            return pd.DataFrame()  # 返回带列名的空DF
        else:
            raise  # 重新抛出其他异常
    except Exception as e:
        print(f"读取文件失败: {e}")
        return pd.DataFrame()
def get_complete_sheet_indus_inters(file_path=None):
    """
    读取行业兴趣sheet，若不存在返回空DataFrame
    """
    try:
        df = pd.read_excel(file_path, sheet_name="行业兴趣")
        # 处理合并单元格
        cols_to_fill = ['人群定向包', '小类', '一级选项']
        df[cols_to_fill] = df[cols_to_fill].ffill()
        print(df)
        return df
    except ValueError as e:
        if "Worksheet named '行业兴趣' not found" in str(e):
            print(f"警告: 文件 {file_path} 中不存在[行业兴趣]sheet")
            return pd.DataFrame()  # 返回空DF
        else:
            raise
    except Exception as e:
        print(f"读取文件失败: {e}")
        return pd.DataFrame()
def get_complete_sheet_keyword(file_path=None):
    """
    读取关键词sheet，若不存在返回空DataFrame
    """
    try:
        df = pd.read_excel(file_path, sheet_name="关键词").dropna(how="all")
        cols_to_fill = ['人群定向包']
        df[cols_to_fill] = df[cols_to_fill].ffill()
        print(df)
        return df
    except ValueError as e:
        if "Worksheet named '关键词' not found" in str(e):
            print(f"警告: 文件 {file_path} 中不存在[关键词]sheet")
            return pd.DataFrame()  # 返回空DF
        else:
            raise
    except Exception as e:
        print(f"读取文件失败: {e}")
        return pd.DataFrame()
def get_complete_sheet_crowd_pack(file_path=None):
    """
    读取关键词sheet，若不存在返回空DataFrame
    """
    try:
        df = pd.read_excel(file_path, sheet_name="人群包")
        print(df)
        return df
    except ValueError as e:
        if "Worksheet named '人群包' not found" in str(e):
            print(f"警告: 文件 {file_path} 中不存在[人群包]sheet")
            return pd.DataFrame()  # 返回空DF
        else:
            raise
    except Exception as e:
        print(f"读取文件失败: {e}")
        return pd.DataFrame()

def get_search_comp(file_path=None, sheet_name='创意信息'):
    """
    读取搜索组件sheet，若不存在返回空DataFrame
    """
    try:
        df = pd.read_excel(file_path, sheet_name=sheet_name)
        return df
    except ValueError as e:
        if "Worksheet named '搜索组件' not found" in str(e):
            print(f"警告: 文件 {file_path} 中不存在{sheet_name}sheet")
            return pd.DataFrame()  # 返回空DF
        else:
            raise
    except Exception as e:
        print(f"读取文件失败: {e}")
        return pd.DataFrame()

def get_chrome_download_directory(
    profile: str = "Default",
    alternative_keys: tuple = ("savefile", "download")
) -> Optional[str]:
    """
    获取 Chrome 浏览器的默认下载目录，并统一使用 / 作为路径分隔符。

    Args:
        profile: Chrome 用户配置名称（如 "Default" 或 "Profile 1"）
        alternative_keys: 尝试从哪些 JSON key 中获取下载目录（按优先级顺序）

    Returns:
        str: 下载目录路径（使用 / 分隔符），如果找到
        None: 如果未找到或出错
    """
    try:
        # 1. 获取 Chrome 用户数据目录
        local_app_data = os.getenv("LOCALAPPDATA")
        if not local_app_data:
            raise FileNotFoundError("LOCALAPPDATA 环境变量未找到（非 Windows 系统？）")

        chrome_user_data = os.path.join(local_app_data, "Google", "Chrome", "User Data")
        if not os.path.exists(chrome_user_data):
            raise FileNotFoundError(f"Chrome 用户数据目录不存在: {chrome_user_data}")

        # 2. 构建 Preferences 文件路径
        preferences_path = os.path.join(chrome_user_data, profile, "Preferences")
        if not os.path.exists(preferences_path):
            raise FileNotFoundError(f"Preferences 文件不存在: {preferences_path}")

        # 3. 读取并解析 JSON 文件
        with open(preferences_path, "r", encoding="utf-8") as f:
            preferences = json.load(f)

        # 4. 尝试从多个可能的键中获取下载目录
        for key in alternative_keys:
            if key in preferences:
                config = preferences[key]
                if isinstance(config, dict):
                    directory = config.get("default_directory")
                    if directory and os.path.isabs(directory):
                        # 规范化路径并转换为 / 分隔符
                        normalized_path = os.path.normpath(directory)
                        return normalized_path.replace("\\", "/")

        return None

    except (FileNotFoundError, json.JSONDecodeError) as e:
        print(f"错误: {e}")
        return None
    except Exception as e:
        print(f"未知错误: {e}")
        return None


def load_valid_cookie(file_name=None):
    """
    从缓存加载有效的 cookie，如果不存在或已过期则返回 None
    """
    if not os.path.exists(file_name):
        return None

    try:
        with open(file_name, 'r', encoding='utf-8') as f:
            cache_data = json.load(f)

        if "expires_at" not in cache_data or "cookie" not in cache_data:
            return None

        expires_at = datetime.fromisoformat(cache_data["expires_at"])
        if datetime.now() < expires_at:
            return cache_data["cookie"], cache_data["account_id"]
        else:
            return None

    except json.JSONDecodeError:
        return None
    except Exception as e:
        return None










